Micron Document
NexusPi Git Node


Displaying Raw • Download

lib/microReticulum/src/Utilities/tlsf.c copilot/add-rtnode-configuration-options (9529fa8a) Text, 35.17 KB

Tff7b72#Tff7b72if !defined(ESP32)

Tff7b72#Tff7b72include T8b949e<assert.h>
Tff7b72#Tff7b72include T8b949e<limits.h>
Tff7b72#Tff7b72include T8b949e<stddef.h>
Tff7b72#Tff7b72include T8b949e<stdio.h>
Tff7b72#Tff7b72include T8b949e<stdlib.h>
Tff7b72#Tff7b72include T8b949e<string.h>

Tff7b72#Tff7b72include T8b949e"tlsf.h"

Tff7b72#Tff7b72if defined(__cplusplus)
Tff7b72#Tff7b72define tlsf_decl inline
Tff7b72#Tff7b72else
Tff7b72#Tff7b72define tlsf_decl static
Tff7b72#Tff7b72endif

T8b949e/*
** Architecture-specific bit manipulation routines.
**
** TLSF achieves O(1) cost for malloc and free operations by limiting
** the search for a free block to a free list of guaranteed size
** adequate to fulfill the request, combined with efficient free list
** queries using bitmasks and architecture-specific bit-manipulation
** routines.
**
** Most modern processors provide instructions to count leading zeroes
** in a word, find the lowest and highest set bit, etc. These
** specific implementations will be used when available, falling back
** to a reasonably efficient generic implementation.
**
** NOTE: TLSF spec relies on ffs/fls returning value 0..31.
** ffs/fls return 1-32 by default, returning 0 for error.
*/

T8b949e/*
** Detect whether or not we are building for a 32- or 64-bit (LP/LLP)
** architecture. There is no reliable portable method at compile-time.
*/
Tff7b72#Tff7b72if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) \
Tff7b72 || defined (_WIN64) || defined (__LP64__) || defined (__LLP64__)
Tff7b72#Tff7b72define TLSF_64BIT
Tff7b72#Tff7b72endif

T8b949e/*
** gcc 3.4 and above have builtin support, specialized for architecture.
** Some compilers masquerade as gcc; patchlevel test filters them out.
*/
Tff7b72#Tff7b72if defined (__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) \
Tff7b72 && defined (__GNUC_PATCHLEVEL__)

Tff7b72#Tff7b72if defined (__SNC__)
T8b949e/* SNC for Playstation 3. */

Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_ffsTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657unsigned Tffa657int Te6edf3reverse Tff7b72= Te6edf3word Tff7b72& Tb4b4b4(Tff7b72~Te6edf3word Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72const Tffa657int Te6edf3bit Tff7b72= T79c0ff32 Tff7b72- Te6edf3__builtin_clzTb4b4b4(Te6edf3reverseTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3bit Tff7b72- T79c0ff1Tb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72else

Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_ffsTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3__builtin_ffsTb4b4b4(Te6edf3wordTb4b4b4) Tff7b72- T79c0ff1Tb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72endif

Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_flsTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657int Te6edf3bit Tff7b72= Te6edf3word Tff7b72? T79c0ff32 Tff7b72- Te6edf3__builtin_clzTb4b4b4(Te6edf3wordTb4b4b4) Tff7b72: T79c0ff0Tb4b4b4;
Tff7b72return Te6edf3bit Tff7b72- T79c0ff1Tb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72elif defined (_MSC_VER) && (_MSC_VER >= 1400) && (defined (_M_IX86) || defined (_M_X64))
T8b949e/* Microsoft Visual C++ support on x86/X64 architectures. */

Tff7b72#Tff7b72include T8b949e<intrin.h>

Tff7b72#Tff7b72pragma intrinsic(_BitScanReverse)
Tff7b72#Tff7b72pragma intrinsic(_BitScanForward)

Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_flsTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tffa657unsigned Tffa657long Te6edf3indexTb4b4b4;
Tff7b72return Te6edf3_BitScanReverseTb4b4b4(Tff7b72&Te6edf3indexTb4b4b4, Te6edf3wordTb4b4b4) Tff7b72? Te6edf3index Tff7b72: T79c0ff-1Tb4b4b4;
Tb4b4b4}

Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_ffsTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tffa657unsigned Tffa657long Te6edf3indexTb4b4b4;
Tff7b72return Te6edf3_BitScanForwardTb4b4b4(Tff7b72&Te6edf3indexTb4b4b4, Te6edf3wordTb4b4b4) Tff7b72? Te6edf3index Tff7b72: T79c0ff-1Tb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72elif defined (_MSC_VER) && defined (_M_PPC)
T8b949e/* Microsoft Visual C++ support on PowerPC architectures. */

Tff7b72#Tff7b72include T8b949e<ppcintrinsics.h>

Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_flsTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657int Te6edf3bit Tff7b72= T79c0ff32 Tff7b72- Te6edf3_CountLeadingZerosTb4b4b4(Te6edf3wordTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3bit Tff7b72- T79c0ff1Tb4b4b4;
Tb4b4b4}

Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_ffsTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657unsigned Tffa657int Te6edf3reverse Tff7b72= Te6edf3word Tff7b72& Tb4b4b4(Tff7b72~Te6edf3word Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72const Tffa657int Te6edf3bit Tff7b72= T79c0ff32 Tff7b72- Te6edf3_CountLeadingZerosTb4b4b4(Te6edf3reverseTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3bit Tff7b72- T79c0ff1Tb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72elif defined (__ARMCC_VERSION)
T8b949e/* RealView Compilation Tools for ARM */

Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_ffsTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657unsigned Tffa657int Te6edf3reverse Tff7b72= Te6edf3word Tff7b72& Tb4b4b4(Tff7b72~Te6edf3word Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72const Tffa657int Te6edf3bit Tff7b72= T79c0ff32 Tff7b72- Te6edf3__clzTb4b4b4(Te6edf3reverseTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3bit Tff7b72- T79c0ff1Tb4b4b4;
Tb4b4b4}

Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_flsTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657int Te6edf3bit Tff7b72= Te6edf3word Tff7b72? T79c0ff32 Tff7b72- Te6edf3__clzTb4b4b4(Te6edf3wordTb4b4b4) Tff7b72: T79c0ff0Tb4b4b4;
Tff7b72return Te6edf3bit Tff7b72- T79c0ff1Tb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72elif defined (__ghs__)
T8b949e/* Green Hills support for PowerPC */

Tff7b72#Tff7b72include T8b949e<ppc_ghs.h>

Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_ffsTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657unsigned Tffa657int Te6edf3reverse Tff7b72= Te6edf3word Tff7b72& Tb4b4b4(Tff7b72~Te6edf3word Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72const Tffa657int Te6edf3bit Tff7b72= T79c0ff32 Tff7b72- Te6edf3__CLZ32Tb4b4b4(Te6edf3reverseTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3bit Tff7b72- T79c0ff1Tb4b4b4;
Tb4b4b4}

Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_flsTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657int Te6edf3bit Tff7b72= Te6edf3word Tff7b72? T79c0ff32 Tff7b72- Te6edf3__CLZ32Tb4b4b4(Te6edf3wordTb4b4b4) Tff7b72: T79c0ff0Tb4b4b4;
Tff7b72return Te6edf3bit Tff7b72- T79c0ff1Tb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72else
T8b949e/* Fall back to generic implementation. */

Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_fls_genericTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tffa657int Te6edf3bit Tff7b72= T79c0ff32Tb4b4b4;

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3wordTb4b4b4) Te6edf3bit Tff7b72-Tff7b72= T79c0ff1Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Te6edf3word Tff7b72& T79c0ff0xffff0000Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3word Tff7b72<Tff7b72<Tff7b72= T79c0ff16Tb4b4b4; Te6edf3bit Tff7b72-Tff7b72= T79c0ff16Tb4b4b4; Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Te6edf3word Tff7b72& T79c0ff0xff000000Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3word Tff7b72<Tff7b72<Tff7b72= T79c0ff8Tb4b4b4; Te6edf3bit Tff7b72-Tff7b72= T79c0ff8Tb4b4b4; Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Te6edf3word Tff7b72& T79c0ff0xf0000000Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3word Tff7b72<Tff7b72<Tff7b72= T79c0ff4Tb4b4b4; Te6edf3bit Tff7b72-Tff7b72= T79c0ff4Tb4b4b4; Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Te6edf3word Tff7b72& T79c0ff0xc0000000Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3word Tff7b72<Tff7b72<Tff7b72= T79c0ff2Tb4b4b4; Te6edf3bit Tff7b72-Tff7b72= T79c0ff2Tb4b4b4; Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Te6edf3word Tff7b72& T79c0ff0x80000000Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3word Tff7b72<Tff7b72<Tff7b72= T79c0ff1Tb4b4b4; Te6edf3bit Tff7b72-Tff7b72= T79c0ff1Tb4b4b4; Tb4b4b4}

Tff7b72return Te6edf3bitTb4b4b4;
Tb4b4b4}

T8b949e/* Implement ffs in terms of fls. */
Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_ffsTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3tlsf_fls_genericTb4b4b4(Te6edf3word Tff7b72& Tb4b4b4(Tff7b72~Te6edf3word Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4) Tff7b72- T79c0ff1Tb4b4b4;
Tb4b4b4}

Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_flsTb4b4b4(Tffa657unsigned Tffa657int Te6edf3wordTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3tlsf_fls_genericTb4b4b4(Te6edf3wordTb4b4b4) Tff7b72- T79c0ff1Tb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72endif

T8b949e/* Possibly 64-bit version of tlsf_fls. */
Tff7b72#Tff7b72if defined (TLSF_64BIT)
Te6edf3tlsf_decl Tffa657int Te6edf3tlsf_fls_sizetTb4b4b4(Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Tffa657int Te6edf3high Tff7b72= Tb4b4b4(Tffa657intTb4b4b4)Tb4b4b4(Te6edf3size Tff7b72>Tff7b72> T79c0ff32Tb4b4b4)Tb4b4b4;
Tffa657int Te6edf3bits Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3highTb4b4b4)
Tb4b4b4{
Te6edf3bits Tff7b72= T79c0ff32 Tff7b72+ Te6edf3tlsf_flsTb4b4b4(Te6edf3highTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else
Tb4b4b4{
Te6edf3bits Tff7b72= Te6edf3tlsf_flsTb4b4b4(Tb4b4b4(Tffa657intTb4b4b4)Te6edf3size Tff7b72& T79c0ff0xffffffffTb4b4b4)Tb4b4b4;

Tb4b4b4}
Tff7b72return Te6edf3bitsTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72else
Tff7b72#Tff7b72define tlsf_fls_sizet tlsf_fls
Tff7b72#Tff7b72endif

Tff7b72#Tff7b72undef tlsf_decl

T8b949e/*
** Constants.
*/

T8b949e/* Public constants: may be modified. */
Tff7b72enum Te6edf3tlsf_public
Tb4b4b4{
T8b949e/* log2 of number of linear subdivisions of block sizes. Larger
** values require more memory in the control structure. Values of
** 4 or 5 are typical.
*/
Te6edf3SL_INDEX_COUNT_LOG2 Tff7b72= T79c0ff5Tb4b4b4,
Tb4b4b4}Tb4b4b4;

T8b949e/* Private constants: do not modify. */
Tff7b72enum Te6edf3tlsf_private
Tb4b4b4{
Tff7b72#Tff7b72if defined (TLSF_64BIT)
T8b949e/* All allocation sizes and addresses are aligned to 8 bytes. */
Te6edf3ALIGN_SIZE_LOG2 Tff7b72= T79c0ff3Tb4b4b4,
Tff7b72#Tff7b72else
T8b949e/* All allocation sizes and addresses are aligned to 4 bytes. */
Te6edf3ALIGN_SIZE_LOG2 Tff7b72= T79c0ff2Tb4b4b4,
Tff7b72#Tff7b72endif
Te6edf3ALIGN_SIZE Tff7b72= Tb4b4b4(T79c0ff1 Tff7b72<Tff7b72< Te6edf3ALIGN_SIZE_LOG2Tb4b4b4)Tb4b4b4,

T8b949e/*
** We support allocations of sizes up to (1 << FL_INDEX_MAX) bits.
** However, because we linearly subdivide the second-level lists, and
** our minimum size granularity is 4 bytes, it doesn't make sense to
** create first-level lists for sizes smaller than SL_INDEX_COUNT * 4,
** or (1 << (SL_INDEX_COUNT_LOG2 + 2)) bytes, as there we will be
** trying to split size ranges into more slots than we have available.
** Instead, we calculate the minimum threshold size, and place all
** blocks below that size into the 0th first-level list.
*/

Tff7b72#Tff7b72if defined (TLSF_64BIT)
T8b949e/*
** TODO: We can increase this to support larger sizes, at the expense
** of more overhead in the TLSF structure.
*/
Te6edf3FL_INDEX_MAX Tff7b72= T79c0ff32Tb4b4b4,
Tff7b72#Tff7b72else
Te6edf3FL_INDEX_MAX Tff7b72= T79c0ff30Tb4b4b4,
Tff7b72#Tff7b72endif
Te6edf3SL_INDEX_COUNT Tff7b72= Tb4b4b4(T79c0ff1 Tff7b72<Tff7b72< Te6edf3SL_INDEX_COUNT_LOG2Tb4b4b4)Tb4b4b4,
Te6edf3FL_INDEX_SHIFT Tff7b72= Tb4b4b4(Te6edf3SL_INDEX_COUNT_LOG2 Tff7b72+ Te6edf3ALIGN_SIZE_LOG2Tb4b4b4)Tb4b4b4,
Te6edf3FL_INDEX_COUNT Tff7b72= Tb4b4b4(Te6edf3FL_INDEX_MAX Tff7b72- Te6edf3FL_INDEX_SHIFT Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4,

Te6edf3SMALL_BLOCK_SIZE Tff7b72= Tb4b4b4(T79c0ff1 Tff7b72<Tff7b72< Te6edf3FL_INDEX_SHIFTTb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;

T8b949e/*
** Cast and min/max macros.
*/

Tff7b72#Tff7b72define tlsf_cast(t, exp) ((t) (exp))
Tff7b72#Tff7b72define tlsf_min(a, b) ((a) < (b) ? (a) : (b))
Tff7b72#Tff7b72define tlsf_max(a, b) ((a) > (b) ? (a) : (b))

T8b949e/*
** Set assert macro, if it has not been provided by the user.
*/
Tff7b72#Tff7b72if !defined (tlsf_assert)
Tff7b72#Tff7b72define tlsf_assert assert
Tff7b72#Tff7b72endif

T8b949e/*
** Static assertion mechanism.
*/

Tff7b72#Tff7b72define _tlsf_glue2(x, y) x ## y
Tff7b72#Tff7b72define _tlsf_glue(x, y) _tlsf_glue2(x, y)
Tff7b72#Tff7b72define tlsf_static_assert(exp) \
Tff7b72 typedef char _tlsf_glue(static_assert, __LINE__) [(exp) ? 1 : -1]

T8b949e/* This code has been tested on 32- and 64-bit (LP/LLP) architectures. */
Te6edf3tlsf_static_assertTb4b4b4(Tff7b72sizeofTb4b4b4(Tffa657intTb4b4b4) Tff7b72* Te6edf3CHAR_BIT Tff7b72=Tff7b72= T79c0ff32Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_static_assertTb4b4b4(Tff7b72sizeofTb4b4b4(Tffa657size_tTb4b4b4) Tff7b72* Te6edf3CHAR_BIT Tff7b72>Tff7b72= T79c0ff32Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_static_assertTb4b4b4(Tff7b72sizeofTb4b4b4(Tffa657size_tTb4b4b4) Tff7b72* Te6edf3CHAR_BIT Tff7b72<Tff7b72= T79c0ff64Tb4b4b4)Tb4b4b4;

T8b949e/* SL_INDEX_COUNT must be <= number of bits in sl_bitmap's storage type. */
Te6edf3tlsf_static_assertTb4b4b4(Tff7b72sizeofTb4b4b4(Tffa657unsigned Tffa657intTb4b4b4) Tff7b72* Te6edf3CHAR_BIT Tff7b72>Tff7b72= Te6edf3SL_INDEX_COUNTTb4b4b4)Tb4b4b4;

T8b949e/* Ensure we've properly tuned our sizes. */
Te6edf3tlsf_static_assertTb4b4b4(Te6edf3ALIGN_SIZE Tff7b72=Tff7b72= Te6edf3SMALL_BLOCK_SIZE Tff7b72/ Te6edf3SL_INDEX_COUNTTb4b4b4)Tb4b4b4;

T8b949e/*
** Data structures and associated constants.
*/

T8b949e/*
** Block header structure.
**
** There are several implementation subtleties involved:
** - The prev_phys_block field is only valid if the previous block is free.
** - The prev_phys_block field is actually stored at the end of the
** previous block. It appears at the beginning of this structure only to
** simplify the implementation.
** - The next_free / prev_free fields are only valid if the block is free.
*/
Tff7b72typedef Tff7b72struct T56d364block_header_t
Tb4b4b4{
T8b949e/* Points to the previous physical block. */
Tff7b72struct T56d364block_header_tTff7b72* Te6edf3prev_phys_blockTb4b4b4;

T8b949e/* The size of this block, excluding the block header. */
Tffa657size_t Te6edf3sizeTb4b4b4;

T8b949e/* Next and previous free blocks. */
Tff7b72struct T56d364block_header_tTff7b72* Te6edf3next_freeTb4b4b4;
Tff7b72struct T56d364block_header_tTff7b72* Te6edf3prev_freeTb4b4b4;
Tb4b4b4} Te6edf3block_header_tTb4b4b4;

T8b949e/*
** Since block sizes are always at least a multiple of 4, the two least
** significant bits of the size field are used to store the block status:
** - bit 0: whether block is busy or free
** - bit 1: whether previous block is busy or free
*/
Tff7b72static Tff7b72const Tffa657size_t Te6edf3block_header_free_bit Tff7b72= T79c0ff1 Tff7b72<Tff7b72< T79c0ff0Tb4b4b4;
Tff7b72static Tff7b72const Tffa657size_t Te6edf3block_header_prev_free_bit Tff7b72= T79c0ff1 Tff7b72<Tff7b72< T79c0ff1Tb4b4b4;

T8b949e/*
** The size of the block header exposed to used blocks is the size field.
** The prev_phys_block field is stored *inside* the previous free block.
*/
Tff7b72static Tff7b72const Tffa657size_t Te6edf3block_header_overhead Tff7b72= Tff7b72sizeofTb4b4b4(Tffa657size_tTb4b4b4)Tb4b4b4;

T8b949e/* User data starts directly after the size field in a used block. */
Tff7b72static Tff7b72const Tffa657size_t Te6edf3block_start_offset Tff7b72=
Te6edf3offsetofTb4b4b4(Te6edf3block_header_tTb4b4b4, Te6edf3sizeTb4b4b4) Tff7b72+ Tff7b72sizeofTb4b4b4(Tffa657size_tTb4b4b4)Tb4b4b4;

T8b949e/*
** A free block must be large enough to store its header minus the size of
** the prev_phys_block field, and no larger than the number of addressable
** bits for FL_INDEX.
*/
Tff7b72static Tff7b72const Tffa657size_t Te6edf3block_size_min Tff7b72=
Tff7b72sizeofTb4b4b4(Te6edf3block_header_tTb4b4b4) Tff7b72- Tff7b72sizeofTb4b4b4(Te6edf3block_header_tTff7b72*Tb4b4b4)Tb4b4b4;
Tff7b72static Tff7b72const Tffa657size_t Te6edf3block_size_max Tff7b72= Te6edf3tlsf_castTb4b4b4(Tffa657size_tTb4b4b4, T79c0ff1Tb4b4b4) Tff7b72<Tff7b72< Te6edf3FL_INDEX_MAXTb4b4b4;


T8b949e/* The TLSF control structure. */
Tff7b72typedef Tff7b72struct T56d364control_t
Tb4b4b4{
T8b949e/* Empty lists point at this block to indicate they are free. */
Te6edf3block_header_t Te6edf3block_nullTb4b4b4;

T8b949e/* Bitmaps for free lists. */
Tffa657unsigned Tffa657int Te6edf3fl_bitmapTb4b4b4;
Tffa657unsigned Tffa657int Te6edf3sl_bitmapTb4b4b4[Te6edf3FL_INDEX_COUNTTb4b4b4]Tb4b4b4;

T8b949e/* Head of free lists. */
Te6edf3block_header_tTff7b72* Te6edf3blocksTb4b4b4[Te6edf3FL_INDEX_COUNTTb4b4b4]Tb4b4b4[Te6edf3SL_INDEX_COUNTTb4b4b4]Tb4b4b4;
Tb4b4b4} Te6edf3control_tTb4b4b4;

T8b949e/* A type used for casting when doing pointer arithmetic. */
Tff7b72typedef Tffa657ptrdiff_t Te6edf3tlsfptr_tTb4b4b4;

T8b949e/*
** block_header_t member functions.
*/

Tff7b72static Tffa657size_t Td2a8ffblock_sizeTb4b4b4(Tff7b72const Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3blockTff7b72-Tff7b72>Te6edf3size Tff7b72& Tff7b72~Tb4b4b4(Te6edf3block_header_free_bit Tff7b72| Te6edf3block_header_prev_free_bitTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657void Td2a8ffblock_set_sizeTb4b4b4(Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657size_t Te6edf3oldsize Tff7b72= Te6edf3blockTff7b72-Tff7b72>Te6edf3sizeTb4b4b4;
Te6edf3blockTff7b72-Tff7b72>Te6edf3size Tff7b72= Te6edf3size Tff7b72| Tb4b4b4(Te6edf3oldsize Tff7b72& Tb4b4b4(Te6edf3block_header_free_bit Tff7b72| Te6edf3block_header_prev_free_bitTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657int Td2a8ffblock_is_lastTb4b4b4(Tff7b72const Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657int Td2a8ffblock_is_freeTb4b4b4(Tff7b72const Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3tlsf_castTb4b4b4(Tffa657intTb4b4b4, Te6edf3blockTff7b72-Tff7b72>Te6edf3size Tff7b72& Te6edf3block_header_free_bitTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657void Td2a8ffblock_set_freeTb4b4b4(Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3blockTff7b72-Tff7b72>Te6edf3size Tff7b72|Tff7b72= Te6edf3block_header_free_bitTb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657void Td2a8ffblock_set_usedTb4b4b4(Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3blockTff7b72-Tff7b72>Te6edf3size Tff7b72&Tff7b72= Tff7b72~Te6edf3block_header_free_bitTb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657int Td2a8ffblock_is_prev_freeTb4b4b4(Tff7b72const Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3tlsf_castTb4b4b4(Tffa657intTb4b4b4, Te6edf3blockTff7b72-Tff7b72>Te6edf3size Tff7b72& Te6edf3block_header_prev_free_bitTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657void Td2a8ffblock_set_prev_freeTb4b4b4(Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3blockTff7b72-Tff7b72>Te6edf3size Tff7b72|Tff7b72= Te6edf3block_header_prev_free_bitTb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657void Td2a8ffblock_set_prev_usedTb4b4b4(Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3blockTff7b72-Tff7b72>Te6edf3size Tff7b72&Tff7b72= Tff7b72~Te6edf3block_header_prev_free_bitTb4b4b4;
Tb4b4b4}

Tff7b72static Te6edf3block_header_tTff7b72* Td2a8ffblock_from_ptrTb4b4b4(Tff7b72const Tffa657voidTff7b72* Te6edf3ptrTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3tlsf_castTb4b4b4(Te6edf3block_header_tTff7b72*Tb4b4b4,
Te6edf3tlsf_castTb4b4b4(Tffa657unsigned Tffa657charTff7b72*Tb4b4b4, Te6edf3ptrTb4b4b4) Tff7b72- Te6edf3block_start_offsetTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657voidTff7b72* Td2a8ffblock_to_ptrTb4b4b4(Tff7b72const Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3tlsf_castTb4b4b4(Tffa657voidTff7b72*Tb4b4b4,
Te6edf3tlsf_castTb4b4b4(Tffa657unsigned Tffa657charTff7b72*Tb4b4b4, Te6edf3blockTb4b4b4) Tff7b72+ Te6edf3block_start_offsetTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/* Return location of next block after block of given size. */
Tff7b72static Te6edf3block_header_tTff7b72* Td2a8ffoffset_to_blockTb4b4b4(Tff7b72const Tffa657voidTff7b72* Te6edf3ptrTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3tlsf_castTb4b4b4(Te6edf3block_header_tTff7b72*Tb4b4b4, Te6edf3tlsf_castTb4b4b4(Te6edf3tlsfptr_tTb4b4b4, Te6edf3ptrTb4b4b4) Tff7b72+ Te6edf3sizeTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/* Return location of previous block. */
Tff7b72static Te6edf3block_header_tTff7b72* Td2a8ffblock_prevTb4b4b4(Tff7b72const Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3tlsf_assertTb4b4b4(Te6edf3block_is_prev_freeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffprevious block must be freeTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3blockTff7b72-Tff7b72>Te6edf3prev_phys_blockTb4b4b4;
Tb4b4b4}

T8b949e/* Return location of next existing block. */
Tff7b72static Te6edf3block_header_tTff7b72* Td2a8ffblock_nextTb4b4b4(Tff7b72const Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3block_header_tTff7b72* Te6edf3next Tff7b72= Te6edf3offset_to_blockTb4b4b4(Te6edf3block_to_ptrTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4,
Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72- Te6edf3block_header_overheadTb4b4b4)Tb4b4b4;
Te6edf3tlsf_assertTb4b4b4(Tff7b72!Te6edf3block_is_lastTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3nextTb4b4b4;
Tb4b4b4}

T8b949e/* Link a new block with its physical neighbor, return the neighbor. */
Tff7b72static Te6edf3block_header_tTff7b72* Td2a8ffblock_link_nextTb4b4b4(Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3block_header_tTff7b72* Te6edf3next Tff7b72= Te6edf3block_nextTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3nextTff7b72-Tff7b72>Te6edf3prev_phys_block Tff7b72= Te6edf3blockTb4b4b4;
Tff7b72return Te6edf3nextTb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657void Td2a8ffblock_mark_as_freeTb4b4b4(Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
T8b949e/* Link the block to the next block, first. */
Te6edf3block_header_tTff7b72* Te6edf3next Tff7b72= Te6edf3block_link_nextTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3block_set_prev_freeTb4b4b4(Te6edf3nextTb4b4b4)Tb4b4b4;
Te6edf3block_set_freeTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657void Td2a8ffblock_mark_as_usedTb4b4b4(Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3block_header_tTff7b72* Te6edf3next Tff7b72= Te6edf3block_nextTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3block_set_prev_usedTb4b4b4(Te6edf3nextTb4b4b4)Tb4b4b4;
Te6edf3block_set_usedTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657size_t Td2a8ffalign_upTb4b4b4(Tffa657size_t Te6edf3xTb4b4b4, Tffa657size_t Te6edf3alignTb4b4b4)
Tb4b4b4{
Te6edf3tlsf_assertTb4b4b4(T79c0ff0 Tff7b72=Tff7b72= Tb4b4b4(Te6edf3align Tff7b72& Tb4b4b4(Te6edf3align Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffmust align to a power of twoTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4(Te6edf3x Tff7b72+ Tb4b4b4(Te6edf3align Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4) Tff7b72& Tff7b72~Tb4b4b4(Te6edf3align Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657size_t Td2a8ffalign_downTb4b4b4(Tffa657size_t Te6edf3xTb4b4b4, Tffa657size_t Te6edf3alignTb4b4b4)
Tb4b4b4{
Te6edf3tlsf_assertTb4b4b4(T79c0ff0 Tff7b72=Tff7b72= Tb4b4b4(Te6edf3align Tff7b72& Tb4b4b4(Te6edf3align Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffmust align to a power of twoTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3x Tff7b72- Tb4b4b4(Te6edf3x Tff7b72& Tb4b4b4(Te6edf3align Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657voidTff7b72* Td2a8ffalign_ptrTb4b4b4(Tff7b72const Tffa657voidTff7b72* Te6edf3ptrTb4b4b4, Tffa657size_t Te6edf3alignTb4b4b4)
Tb4b4b4{
Tff7b72const Te6edf3tlsfptr_t Te6edf3aligned Tff7b72=
Tb4b4b4(Te6edf3tlsf_castTb4b4b4(Te6edf3tlsfptr_tTb4b4b4, Te6edf3ptrTb4b4b4) Tff7b72+ Tb4b4b4(Te6edf3align Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4) Tff7b72& Tff7b72~Tb4b4b4(Te6edf3align Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_assertTb4b4b4(T79c0ff0 Tff7b72=Tff7b72= Tb4b4b4(Te6edf3align Tff7b72& Tb4b4b4(Te6edf3align Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffmust align to a power of twoTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3tlsf_castTb4b4b4(Tffa657voidTff7b72*Tb4b4b4, Te6edf3alignedTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/*
** Adjust an allocation size to be aligned to word size, and no smaller
** than internal minimum.
*/
Tff7b72static Tffa657size_t Td2a8ffadjust_request_sizeTb4b4b4(Tffa657size_t Te6edf3sizeTb4b4b4, Tffa657size_t Te6edf3alignTb4b4b4)
Tb4b4b4{
Tffa657size_t Te6edf3adjust Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sizeTb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657size_t Te6edf3aligned Tff7b72= Te6edf3align_upTb4b4b4(Te6edf3sizeTb4b4b4, Te6edf3alignTb4b4b4)Tb4b4b4;

T8b949e/* aligned sized must not exceed block_size_max or we'll go out of bounds on sl_bitmap */
Tff7b72if Tb4b4b4(Te6edf3aligned Tff7b72< Te6edf3block_size_maxTb4b4b4)
Tb4b4b4{
Te6edf3adjust Tff7b72= Te6edf3tlsf_maxTb4b4b4(Te6edf3alignedTb4b4b4, Te6edf3block_size_minTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3adjustTb4b4b4;
Tb4b4b4}

T8b949e/*
** TLSF utility functions. In most cases, these are direct translations of
** the documentation found in the white paper.
*/

Tff7b72static Tffa657void Td2a8ffmapping_insertTb4b4b4(Tffa657size_t Te6edf3sizeTb4b4b4, Tffa657intTff7b72* Te6edf3fliTb4b4b4, Tffa657intTff7b72* Te6edf3sliTb4b4b4)
Tb4b4b4{
Tffa657int Te6edf3flTb4b4b4, Te6edf3slTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3size Tff7b72< Te6edf3SMALL_BLOCK_SIZETb4b4b4)
Tb4b4b4{
T8b949e/* Store small blocks in first list. */
Te6edf3fl Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3sl Tff7b72= Te6edf3tlsf_castTb4b4b4(Tffa657intTb4b4b4, Te6edf3sizeTb4b4b4) Tff7b72/ Tb4b4b4(Te6edf3SMALL_BLOCK_SIZE Tff7b72/ Te6edf3SL_INDEX_COUNTTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else
Tb4b4b4{
Te6edf3fl Tff7b72= Te6edf3tlsf_fls_sizetTb4b4b4(Te6edf3sizeTb4b4b4)Tb4b4b4;
Te6edf3sl Tff7b72= Te6edf3tlsf_castTb4b4b4(Tffa657intTb4b4b4, Te6edf3size Tff7b72>Tff7b72> Tb4b4b4(Te6edf3fl Tff7b72- Te6edf3SL_INDEX_COUNT_LOG2Tb4b4b4)Tb4b4b4) Tff7b72^ Tb4b4b4(T79c0ff1 Tff7b72<Tff7b72< Te6edf3SL_INDEX_COUNT_LOG2Tb4b4b4)Tb4b4b4;
Te6edf3fl Tff7b72-Tff7b72= Tb4b4b4(Te6edf3FL_INDEX_SHIFT Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72*Te6edf3fli Tff7b72= Te6edf3flTb4b4b4;
Tff7b72*Te6edf3sli Tff7b72= Te6edf3slTb4b4b4;
Tb4b4b4}

T8b949e/* This version rounds up to the next block size (for allocations) */
Tff7b72static Tffa657void Td2a8ffmapping_searchTb4b4b4(Tffa657size_t Te6edf3sizeTb4b4b4, Tffa657intTff7b72* Te6edf3fliTb4b4b4, Tffa657intTff7b72* Te6edf3sliTb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3size Tff7b72>Tff7b72= Te6edf3SMALL_BLOCK_SIZETb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657size_t Te6edf3round Tff7b72= Tb4b4b4(T79c0ff1 Tff7b72<Tff7b72< Tb4b4b4(Te6edf3tlsf_fls_sizetTb4b4b4(Te6edf3sizeTb4b4b4) Tff7b72- Te6edf3SL_INDEX_COUNT_LOG2Tb4b4b4)Tb4b4b4) Tff7b72- T79c0ff1Tb4b4b4;
Te6edf3size Tff7b72+Tff7b72= Te6edf3roundTb4b4b4;
Tb4b4b4}
Te6edf3mapping_insertTb4b4b4(Te6edf3sizeTb4b4b4, Te6edf3fliTb4b4b4, Te6edf3sliTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Te6edf3block_header_tTff7b72* Td2a8ffsearch_suitable_blockTb4b4b4(Te6edf3control_tTff7b72* Te6edf3controlTb4b4b4, Tffa657intTff7b72* Te6edf3fliTb4b4b4, Tffa657intTff7b72* Te6edf3sliTb4b4b4)
Tb4b4b4{
Tffa657int Te6edf3fl Tff7b72= Tff7b72*Te6edf3fliTb4b4b4;
Tffa657int Te6edf3sl Tff7b72= Tff7b72*Te6edf3sliTb4b4b4;

T8b949e/*
** First, search for a block in the list associated with the given
** fl/sl index.
*/
Tffa657unsigned Tffa657int Te6edf3sl_map Tff7b72= Te6edf3controlTff7b72-Tff7b72>Te6edf3sl_bitmapTb4b4b4[Te6edf3flTb4b4b4] Tff7b72& Tb4b4b4(Tff7b72~T79c0ff0U Tff7b72<Tff7b72< Te6edf3slTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3sl_mapTb4b4b4)
Tb4b4b4{
T8b949e/* No block exists. Search in the next largest first-level list. */
Tff7b72const Tffa657unsigned Tffa657int Te6edf3fl_map Tff7b72= Te6edf3controlTff7b72-Tff7b72>Te6edf3fl_bitmap Tff7b72& Tb4b4b4(Tff7b72~T79c0ff0U Tff7b72<Tff7b72< Tb4b4b4(Te6edf3fl Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fl_mapTb4b4b4)
Tb4b4b4{
T8b949e/* No free blocks available, memory has been exhausted. */
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

Te6edf3fl Tff7b72= Te6edf3tlsf_ffsTb4b4b4(Te6edf3fl_mapTb4b4b4)Tb4b4b4;
Tff7b72*Te6edf3fli Tff7b72= Te6edf3flTb4b4b4;
Te6edf3sl_map Tff7b72= Te6edf3controlTff7b72-Tff7b72>Te6edf3sl_bitmapTb4b4b4[Te6edf3flTb4b4b4]Tb4b4b4;
Tb4b4b4}
Te6edf3tlsf_assertTb4b4b4(Te6edf3sl_map Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffinternal error - second level bitmap is nullTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3sl Tff7b72= Te6edf3tlsf_ffsTb4b4b4(Te6edf3sl_mapTb4b4b4)Tb4b4b4;
Tff7b72*Te6edf3sli Tff7b72= Te6edf3slTb4b4b4;

T8b949e/* Return the first block in the free list. */
Tff7b72return Te6edf3controlTff7b72-Tff7b72>Te6edf3blocksTb4b4b4[Te6edf3flTb4b4b4]Tb4b4b4[Te6edf3slTb4b4b4]Tb4b4b4;
Tb4b4b4}

T8b949e/* Remove a free block from the free list.*/
Tff7b72static Tffa657void Td2a8ffremove_free_blockTb4b4b4(Te6edf3control_tTff7b72* Te6edf3controlTb4b4b4, Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4, Tffa657int Te6edf3flTb4b4b4, Tffa657int Te6edf3slTb4b4b4)
Tb4b4b4{
Te6edf3block_header_tTff7b72* Te6edf3prev Tff7b72= Te6edf3blockTff7b72-Tff7b72>Te6edf3prev_freeTb4b4b4;
Te6edf3block_header_tTff7b72* Te6edf3next Tff7b72= Te6edf3blockTff7b72-Tff7b72>Te6edf3next_freeTb4b4b4;
Te6edf3tlsf_assertTb4b4b4(Te6edf3prev Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffprev_free field can not be nullTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_assertTb4b4b4(Te6edf3next Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffnext_free field can not be nullTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3nextTff7b72-Tff7b72>Te6edf3prev_free Tff7b72= Te6edf3prevTb4b4b4;
Te6edf3prevTff7b72-Tff7b72>Te6edf3next_free Tff7b72= Te6edf3nextTb4b4b4;

T8b949e/* If this block is the head of the free list, set new head. */
Tff7b72if Tb4b4b4(Te6edf3controlTff7b72-Tff7b72>Te6edf3blocksTb4b4b4[Te6edf3flTb4b4b4]Tb4b4b4[Te6edf3slTb4b4b4] Tff7b72=Tff7b72= Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3controlTff7b72-Tff7b72>Te6edf3blocksTb4b4b4[Te6edf3flTb4b4b4]Tb4b4b4[Te6edf3slTb4b4b4] Tff7b72= Te6edf3nextTb4b4b4;

T8b949e/* If the new head is null, clear the bitmap. */
Tff7b72if Tb4b4b4(Te6edf3next Tff7b72=Tff7b72= Tff7b72&Te6edf3controlTff7b72-Tff7b72>Te6edf3block_nullTb4b4b4)
Tb4b4b4{
Te6edf3controlTff7b72-Tff7b72>Te6edf3sl_bitmapTb4b4b4[Te6edf3flTb4b4b4] Tff7b72&Tff7b72= Tff7b72~Tb4b4b4(T79c0ff1U Tff7b72<Tff7b72< Te6edf3slTb4b4b4)Tb4b4b4;

T8b949e/* If the second bitmap is now empty, clear the fl bitmap. */
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3controlTff7b72-Tff7b72>Te6edf3sl_bitmapTb4b4b4[Te6edf3flTb4b4b4]Tb4b4b4)
Tb4b4b4{
Te6edf3controlTff7b72-Tff7b72>Te6edf3fl_bitmap Tff7b72&Tff7b72= Tff7b72~Tb4b4b4(T79c0ff1U Tff7b72<Tff7b72< Te6edf3flTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

T8b949e/* Insert a free block into the free block list. */
Tff7b72static Tffa657void Td2a8ffinsert_free_blockTb4b4b4(Te6edf3control_tTff7b72* Te6edf3controlTb4b4b4, Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4, Tffa657int Te6edf3flTb4b4b4, Tffa657int Te6edf3slTb4b4b4)
Tb4b4b4{
Te6edf3block_header_tTff7b72* Te6edf3current Tff7b72= Te6edf3controlTff7b72-Tff7b72>Te6edf3blocksTb4b4b4[Te6edf3flTb4b4b4]Tb4b4b4[Te6edf3slTb4b4b4]Tb4b4b4;
Te6edf3tlsf_assertTb4b4b4(Te6edf3current Tff7b72&Tff7b72& Ta5d6ff"Ta5d6fffree list cannot have a null entryTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_assertTb4b4b4(Te6edf3block Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffcannot insert a null entry into the free listTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3blockTff7b72-Tff7b72>Te6edf3next_free Tff7b72= Te6edf3currentTb4b4b4;
Te6edf3blockTff7b72-Tff7b72>Te6edf3prev_free Tff7b72= Tff7b72&Te6edf3controlTff7b72-Tff7b72>Te6edf3block_nullTb4b4b4;
Te6edf3currentTff7b72-Tff7b72>Te6edf3prev_free Tff7b72= Te6edf3blockTb4b4b4;

Te6edf3tlsf_assertTb4b4b4(Te6edf3block_to_ptrTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72=Tff7b72= Te6edf3align_ptrTb4b4b4(Te6edf3block_to_ptrTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4, Te6edf3ALIGN_SIZETb4b4b4)
Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock not aligned properlyTa5d6ff"Tb4b4b4)Tb4b4b4;
T8b949e/*
** Insert the new block at the head of the list, and mark the first-
** and second-level bitmaps appropriately.
*/
Te6edf3controlTff7b72-Tff7b72>Te6edf3blocksTb4b4b4[Te6edf3flTb4b4b4]Tb4b4b4[Te6edf3slTb4b4b4] Tff7b72= Te6edf3blockTb4b4b4;
Te6edf3controlTff7b72-Tff7b72>Te6edf3fl_bitmap Tff7b72|Tff7b72= Tb4b4b4(T79c0ff1U Tff7b72<Tff7b72< Te6edf3flTb4b4b4)Tb4b4b4;
Te6edf3controlTff7b72-Tff7b72>Te6edf3sl_bitmapTb4b4b4[Te6edf3flTb4b4b4] Tff7b72|Tff7b72= Tb4b4b4(T79c0ff1U Tff7b72<Tff7b72< Te6edf3slTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/* Remove a given block from the free list. */
Tff7b72static Tffa657void Td2a8ffblock_removeTb4b4b4(Te6edf3control_tTff7b72* Te6edf3controlTb4b4b4, Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Tffa657int Te6edf3flTb4b4b4, Te6edf3slTb4b4b4;
Te6edf3mapping_insertTb4b4b4(Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4, Tff7b72&Te6edf3flTb4b4b4, Tff7b72&Te6edf3slTb4b4b4)Tb4b4b4;
Te6edf3remove_free_blockTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4, Te6edf3flTb4b4b4, Te6edf3slTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/* Insert a given block into the free list. */
Tff7b72static Tffa657void Td2a8ffblock_insertTb4b4b4(Te6edf3control_tTff7b72* Te6edf3controlTb4b4b4, Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Tffa657int Te6edf3flTb4b4b4, Te6edf3slTb4b4b4;
Te6edf3mapping_insertTb4b4b4(Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4, Tff7b72&Te6edf3flTb4b4b4, Tff7b72&Te6edf3slTb4b4b4)Tb4b4b4;
Te6edf3insert_free_blockTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4, Te6edf3flTb4b4b4, Te6edf3slTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657int Td2a8ffblock_can_splitTb4b4b4(Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72>Tff7b72= Tff7b72sizeofTb4b4b4(Te6edf3block_header_tTb4b4b4) Tff7b72+ Te6edf3sizeTb4b4b4;
Tb4b4b4}

T8b949e/* Split a block into two, the second of which is free. */
Tff7b72static Te6edf3block_header_tTff7b72* Td2a8ffblock_splitTb4b4b4(Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
T8b949e/* Calculate the amount of space left in the remaining block. */
Te6edf3block_header_tTff7b72* Te6edf3remaining Tff7b72=
Te6edf3offset_to_blockTb4b4b4(Te6edf3block_to_ptrTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4, Te6edf3size Tff7b72- Te6edf3block_header_overheadTb4b4b4)Tb4b4b4;

Tff7b72const Tffa657size_t Te6edf3remain_size Tff7b72= Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72- Tb4b4b4(Te6edf3size Tff7b72+ Te6edf3block_header_overheadTb4b4b4)Tb4b4b4;

Te6edf3tlsf_assertTb4b4b4(Te6edf3block_to_ptrTb4b4b4(Te6edf3remainingTb4b4b4) Tff7b72=Tff7b72= Te6edf3align_ptrTb4b4b4(Te6edf3block_to_ptrTb4b4b4(Te6edf3remainingTb4b4b4)Tb4b4b4, Te6edf3ALIGN_SIZETb4b4b4)
Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffremaining block not aligned properlyTa5d6ff"Tb4b4b4)Tb4b4b4;

Te6edf3tlsf_assertTb4b4b4(Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72=Tff7b72= Te6edf3remain_size Tff7b72+ Te6edf3size Tff7b72+ Te6edf3block_header_overheadTb4b4b4)Tb4b4b4;
Te6edf3block_set_sizeTb4b4b4(Te6edf3remainingTb4b4b4, Te6edf3remain_sizeTb4b4b4)Tb4b4b4;
Te6edf3tlsf_assertTb4b4b4(Te6edf3block_sizeTb4b4b4(Te6edf3remainingTb4b4b4) Tff7b72>Tff7b72= Te6edf3block_size_min Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock split with invalid sizeTa5d6ff"Tb4b4b4)Tb4b4b4;

Te6edf3block_set_sizeTb4b4b4(Te6edf3blockTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Te6edf3block_mark_as_freeTb4b4b4(Te6edf3remainingTb4b4b4)Tb4b4b4;

Tff7b72return Te6edf3remainingTb4b4b4;
Tb4b4b4}

T8b949e/* Absorb a free block's storage into an adjacent previous free block. */
Tff7b72static Te6edf3block_header_tTff7b72* Td2a8ffblock_absorbTb4b4b4(Te6edf3block_header_tTff7b72* Te6edf3prevTb4b4b4, Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3tlsf_assertTb4b4b4(Tff7b72!Te6edf3block_is_lastTb4b4b4(Te6edf3prevTb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffprevious block can't be lastTa5d6ff"Tb4b4b4)Tb4b4b4;
T8b949e/* Note: Leaves flags untouched. */
Te6edf3prevTff7b72-Tff7b72>Te6edf3size Tff7b72+Tff7b72= Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72+ Te6edf3block_header_overheadTb4b4b4;
Te6edf3block_link_nextTb4b4b4(Te6edf3prevTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3prevTb4b4b4;
Tb4b4b4}

T8b949e/* Merge a just-freed block with an adjacent previous free block. */
Tff7b72static Te6edf3block_header_tTff7b72* Td2a8ffblock_merge_prevTb4b4b4(Te6edf3control_tTff7b72* Te6edf3controlTb4b4b4, Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3block_is_prev_freeTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4)
Tb4b4b4{
Te6edf3block_header_tTff7b72* Te6edf3prev Tff7b72= Te6edf3block_prevTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3tlsf_assertTb4b4b4(Te6edf3prev Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffprev physical block can't be nullTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_assertTb4b4b4(Te6edf3block_is_freeTb4b4b4(Te6edf3prevTb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffprev block is not free though marked as suchTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3block_removeTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3prevTb4b4b4)Tb4b4b4;
Te6edf3block Tff7b72= Te6edf3block_absorbTb4b4b4(Te6edf3prevTb4b4b4, Te6edf3blockTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72return Te6edf3blockTb4b4b4;
Tb4b4b4}

T8b949e/* Merge a just-freed block with an adjacent free block. */
Tff7b72static Te6edf3block_header_tTff7b72* Td2a8ffblock_merge_nextTb4b4b4(Te6edf3control_tTff7b72* Te6edf3controlTb4b4b4, Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3block_header_tTff7b72* Te6edf3next Tff7b72= Te6edf3block_nextTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3tlsf_assertTb4b4b4(Te6edf3next Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffnext physical block can't be nullTa5d6ff"Tb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3block_is_freeTb4b4b4(Te6edf3nextTb4b4b4)Tb4b4b4)
Tb4b4b4{
Te6edf3tlsf_assertTb4b4b4(Tff7b72!Te6edf3block_is_lastTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffprevious block can't be lastTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3block_removeTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3nextTb4b4b4)Tb4b4b4;
Te6edf3block Tff7b72= Te6edf3block_absorbTb4b4b4(Te6edf3blockTb4b4b4, Te6edf3nextTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72return Te6edf3blockTb4b4b4;
Tb4b4b4}

T8b949e/* Trim any trailing block space off the end of a block, return to pool. */
Tff7b72static Tffa657void Td2a8ffblock_trim_freeTb4b4b4(Te6edf3control_tTff7b72* Te6edf3controlTb4b4b4, Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Te6edf3tlsf_assertTb4b4b4(Te6edf3block_is_freeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock must be freeTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3block_can_splitTb4b4b4(Te6edf3blockTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4)
Tb4b4b4{
Te6edf3block_header_tTff7b72* Te6edf3remaining_block Tff7b72= Te6edf3block_splitTb4b4b4(Te6edf3blockTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Te6edf3block_link_nextTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3block_set_prev_freeTb4b4b4(Te6edf3remaining_blockTb4b4b4)Tb4b4b4;
Te6edf3block_insertTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3remaining_blockTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/* Trim any trailing block space off the end of a used block, return to pool. */
Tff7b72static Tffa657void Td2a8ffblock_trim_usedTb4b4b4(Te6edf3control_tTff7b72* Te6edf3controlTb4b4b4, Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Te6edf3tlsf_assertTb4b4b4(Tff7b72!Te6edf3block_is_freeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock must be usedTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3block_can_splitTb4b4b4(Te6edf3blockTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4)
Tb4b4b4{
T8b949e/* If the next block is free, we must coalesce. */
Te6edf3block_header_tTff7b72* Te6edf3remaining_block Tff7b72= Te6edf3block_splitTb4b4b4(Te6edf3blockTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Te6edf3block_set_prev_usedTb4b4b4(Te6edf3remaining_blockTb4b4b4)Tb4b4b4;

Te6edf3remaining_block Tff7b72= Te6edf3block_merge_nextTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3remaining_blockTb4b4b4)Tb4b4b4;
Te6edf3block_insertTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3remaining_blockTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72static Te6edf3block_header_tTff7b72* Td2a8ffblock_trim_free_leadingTb4b4b4(Te6edf3control_tTff7b72* Te6edf3controlTb4b4b4, Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Te6edf3block_header_tTff7b72* Te6edf3remaining_block Tff7b72= Te6edf3blockTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3block_can_splitTb4b4b4(Te6edf3blockTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4)
Tb4b4b4{
T8b949e/* We want the 2nd block. */
Te6edf3remaining_block Tff7b72= Te6edf3block_splitTb4b4b4(Te6edf3blockTb4b4b4, Te6edf3size Tff7b72- Te6edf3block_header_overheadTb4b4b4)Tb4b4b4;
Te6edf3block_set_prev_freeTb4b4b4(Te6edf3remaining_blockTb4b4b4)Tb4b4b4;

Te6edf3block_link_nextTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3block_insertTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72return Te6edf3remaining_blockTb4b4b4;
Tb4b4b4}

Tff7b72static Te6edf3block_header_tTff7b72* Td2a8ffblock_locate_freeTb4b4b4(Te6edf3control_tTff7b72* Te6edf3controlTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Tffa657int Te6edf3fl Tff7b72= T79c0ff0Tb4b4b4, Te6edf3sl Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3block_header_tTff7b72* Te6edf3block Tff7b72= T79c0ff0Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3sizeTb4b4b4)
Tb4b4b4{
Te6edf3mapping_searchTb4b4b4(Te6edf3sizeTb4b4b4, Tff7b72&Te6edf3flTb4b4b4, Tff7b72&Te6edf3slTb4b4b4)Tb4b4b4;
T8b949e/*
** mapping_search can futz with the size, so for excessively large sizes it can sometimes wind up
** with indices that are off the end of the block array.
** So, we protect against that here, since this is the only callsite of mapping_search.
** Note that we don't need to check sl, since it comes from a modulo operation that guarantees it's always in range.
*/
Tff7b72if Tb4b4b4(Te6edf3fl Tff7b72< Te6edf3FL_INDEX_COUNTTb4b4b4)
Tb4b4b4{
Te6edf3block Tff7b72= Te6edf3search_suitable_blockTb4b4b4(Te6edf3controlTb4b4b4, Tff7b72&Te6edf3flTb4b4b4, Tff7b72&Te6edf3slTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3tlsf_assertTb4b4b4(Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72>Tff7b72= Te6edf3sizeTb4b4b4)Tb4b4b4;
Te6edf3remove_free_blockTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4, Te6edf3flTb4b4b4, Te6edf3slTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72return Te6edf3blockTb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657voidTff7b72* Td2a8ffblock_prepare_usedTb4b4b4(Te6edf3control_tTff7b72* Te6edf3controlTb4b4b4, Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Tffa657voidTff7b72* Te6edf3p Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3blockTb4b4b4)
Tb4b4b4{
Te6edf3tlsf_assertTb4b4b4(Te6edf3size Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffsize must be non-zeroTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3block_trim_freeTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Te6edf3block_mark_as_usedTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3p Tff7b72= Te6edf3block_to_ptrTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3pTb4b4b4;
Tb4b4b4}

T8b949e/* Clear structure and point all empty lists at the null block. */
Tff7b72static Tffa657void Td2a8ffcontrol_constructTb4b4b4(Te6edf3control_tTff7b72* Te6edf3controlTb4b4b4)
Tb4b4b4{
Tffa657int Te6edf3iTb4b4b4, Te6edf3jTb4b4b4;

Te6edf3controlTff7b72-Tff7b72>Te6edf3block_nullTb4b4b4.Te6edf3next_free Tff7b72= Tff7b72&Te6edf3controlTff7b72-Tff7b72>Te6edf3block_nullTb4b4b4;
Te6edf3controlTff7b72-Tff7b72>Te6edf3block_nullTb4b4b4.Te6edf3prev_free Tff7b72= Tff7b72&Te6edf3controlTff7b72-Tff7b72>Te6edf3block_nullTb4b4b4;

Te6edf3controlTff7b72-Tff7b72>Te6edf3fl_bitmap Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3FL_INDEX_COUNTTb4b4b4; Tff7b72+Tff7b72+Te6edf3iTb4b4b4)
Tb4b4b4{
Te6edf3controlTff7b72-Tff7b72>Te6edf3sl_bitmapTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3j Tff7b72= T79c0ff0Tb4b4b4; Te6edf3j Tff7b72< Te6edf3SL_INDEX_COUNTTb4b4b4; Tff7b72+Tff7b72+Te6edf3jTb4b4b4)
Tb4b4b4{
Te6edf3controlTff7b72-Tff7b72>Te6edf3blocksTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[Te6edf3jTb4b4b4] Tff7b72= Tff7b72&Te6edf3controlTff7b72-Tff7b72>Te6edf3block_nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

T8b949e/*
** Debugging utilities.
*/

Tff7b72typedef Tff7b72struct T56d364integrity_t
Tb4b4b4{
Tffa657int Te6edf3prev_statusTb4b4b4;
Tffa657int Te6edf3statusTb4b4b4;
Tb4b4b4} Te6edf3integrity_tTb4b4b4;

Tff7b72#Tff7b72define tlsf_insist(x) { tlsf_assert(x); if (!(x)) { status--; } }

Tff7b72static Tffa657void Td2a8ffintegrity_walkerTb4b4b4(Tffa657voidTff7b72* Te6edf3ptrTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4, Tffa657int Te6edf3usedTb4b4b4, Tffa657voidTff7b72* Te6edf3userTb4b4b4)
Tb4b4b4{
Te6edf3block_header_tTff7b72* Te6edf3block Tff7b72= Te6edf3block_from_ptrTb4b4b4(Te6edf3ptrTb4b4b4)Tb4b4b4;
Te6edf3integrity_tTff7b72* Te6edf3integ Tff7b72= Te6edf3tlsf_castTb4b4b4(Te6edf3integrity_tTff7b72*Tb4b4b4, Te6edf3userTb4b4b4)Tb4b4b4;
Tff7b72const Tffa657int Te6edf3this_prev_status Tff7b72= Te6edf3block_is_prev_freeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72? T79c0ff1 Tff7b72: T79c0ff0Tb4b4b4;
Tff7b72const Tffa657int Te6edf3this_status Tff7b72= Te6edf3block_is_freeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72? T79c0ff1 Tff7b72: T79c0ff0Tb4b4b4;
Tff7b72const Tffa657size_t Te6edf3this_block_size Tff7b72= Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;

Tffa657int Te6edf3status Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4(Tffa657voidTb4b4b4)Te6edf3usedTb4b4b4;
Te6edf3tlsf_insistTb4b4b4(Te6edf3integTff7b72-Tff7b72>Te6edf3prev_status Tff7b72=Tff7b72= Te6edf3this_prev_status Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffprev status incorrectTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_insistTb4b4b4(Te6edf3size Tff7b72=Tff7b72= Te6edf3this_block_size Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock size incorrectTa5d6ff"Tb4b4b4)Tb4b4b4;

Te6edf3integTff7b72-Tff7b72>Te6edf3prev_status Tff7b72= Te6edf3this_statusTb4b4b4;
Te6edf3integTff7b72-Tff7b72>Te6edf3status Tff7b72+Tff7b72= Te6edf3statusTb4b4b4;
Tb4b4b4}

Tffa657int Td2a8fftlsf_checkTb4b4b4(Te6edf3tlsf_t Te6edf3tlsfTb4b4b4)
Tb4b4b4{
Tffa657int Te6edf3iTb4b4b4, Te6edf3jTb4b4b4;

Te6edf3control_tTff7b72* Te6edf3control Tff7b72= Te6edf3tlsf_castTb4b4b4(Te6edf3control_tTff7b72*Tb4b4b4, Te6edf3tlsfTb4b4b4)Tb4b4b4;
Tffa657int Te6edf3status Tff7b72= T79c0ff0Tb4b4b4;

T8b949e/* Check that the free lists and bitmaps are accurate. */
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3FL_INDEX_COUNTTb4b4b4; Tff7b72+Tff7b72+Te6edf3iTb4b4b4)
Tb4b4b4{
Tff7b72for Tb4b4b4(Te6edf3j Tff7b72= T79c0ff0Tb4b4b4; Te6edf3j Tff7b72< Te6edf3SL_INDEX_COUNTTb4b4b4; Tff7b72+Tff7b72+Te6edf3jTb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657int Te6edf3fl_map Tff7b72= Te6edf3controlTff7b72-Tff7b72>Te6edf3fl_bitmap Tff7b72& Tb4b4b4(T79c0ff1U Tff7b72<Tff7b72< Te6edf3iTb4b4b4)Tb4b4b4;
Tff7b72const Tffa657int Te6edf3sl_list Tff7b72= Te6edf3controlTff7b72-Tff7b72>Te6edf3sl_bitmapTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Tff7b72const Tffa657int Te6edf3sl_map Tff7b72= Te6edf3sl_list Tff7b72& Tb4b4b4(T79c0ff1U Tff7b72<Tff7b72< Te6edf3jTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3block_header_tTff7b72* Te6edf3block Tff7b72= Te6edf3controlTff7b72-Tff7b72>Te6edf3blocksTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[Te6edf3jTb4b4b4]Tb4b4b4;

T8b949e/* Check that first- and second-level lists agree. */
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fl_mapTb4b4b4)
Tb4b4b4{
Te6edf3tlsf_insistTb4b4b4(Tff7b72!Te6edf3sl_map Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffsecond-level map must be nullTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3sl_mapTb4b4b4)
Tb4b4b4{
Te6edf3tlsf_insistTb4b4b4(Te6edf3block Tff7b72=Tff7b72= Tff7b72&Te6edf3controlTff7b72-Tff7b72>Te6edf3block_null Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock list must be nullTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72continueTb4b4b4;
Tb4b4b4}

T8b949e/* Check that there is at least one free block. */
Te6edf3tlsf_insistTb4b4b4(Te6edf3sl_list Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffno free blocks in second-level mapTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_insistTb4b4b4(Te6edf3block Tff7b72!Tff7b72= Tff7b72&Te6edf3controlTff7b72-Tff7b72>Te6edf3block_null Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock should not be nullTa5d6ff"Tb4b4b4)Tb4b4b4;

Tff7b72while Tb4b4b4(Te6edf3block Tff7b72!Tff7b72= Tff7b72&Te6edf3controlTff7b72-Tff7b72>Te6edf3block_nullTb4b4b4)
Tb4b4b4{
Tffa657int Te6edf3fliTb4b4b4, Te6edf3sliTb4b4b4;
Te6edf3tlsf_insistTb4b4b4(Te6edf3block_is_freeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock should be freeTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_insistTb4b4b4(Tff7b72!Te6edf3block_is_prev_freeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblocks should have coalescedTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_insistTb4b4b4(Tff7b72!Te6edf3block_is_freeTb4b4b4(Te6edf3block_nextTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblocks should have coalescedTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_insistTb4b4b4(Te6edf3block_is_prev_freeTb4b4b4(Te6edf3block_nextTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock should be freeTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_insistTb4b4b4(Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72>Tff7b72= Te6edf3block_size_min Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock not minimum sizeTa5d6ff"Tb4b4b4)Tb4b4b4;

Te6edf3mapping_insertTb4b4b4(Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4, Tff7b72&Te6edf3fliTb4b4b4, Tff7b72&Te6edf3sliTb4b4b4)Tb4b4b4;
Te6edf3tlsf_insistTb4b4b4(Te6edf3fli Tff7b72=Tff7b72= Te6edf3i Tff7b72&Tff7b72& Te6edf3sli Tff7b72=Tff7b72= Te6edf3j Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock size indexed in wrong listTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3block Tff7b72= Te6edf3blockTff7b72-Tff7b72>Te6edf3next_freeTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72return Te6edf3statusTb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72undef tlsf_insist

Tff7b72static Tffa657void Td2a8ffdefault_walkerTb4b4b4(Tffa657voidTff7b72* Te6edf3ptrTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4, Tffa657int Te6edf3usedTb4b4b4, Tffa657voidTff7b72* Te6edf3userTb4b4b4)
Tb4b4b4{
Tb4b4b4(Tffa657voidTb4b4b4)Te6edf3userTb4b4b4;
Te6edf3printfTb4b4b4(Ta5d6ff"Tffea00\tTa5d6ff%p %s size: %x (%p)Tffea00\nTa5d6ff"Tb4b4b4, Te6edf3ptrTb4b4b4, Te6edf3used Tff7b72? Ta5d6ff"Ta5d6ffusedTa5d6ff" Tff7b72: Ta5d6ff"Ta5d6fffreeTa5d6ff"Tb4b4b4, Tb4b4b4(Tffa657unsigned Tffa657intTb4b4b4)Te6edf3sizeTb4b4b4, Te6edf3block_from_ptrTb4b4b4(Te6edf3ptrTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Td2a8fftlsf_walk_poolTb4b4b4(Te6edf3pool_t Te6edf3poolTb4b4b4, Te6edf3tlsf_walker Te6edf3walkerTb4b4b4, Tffa657voidTff7b72* Te6edf3userTb4b4b4)
Tb4b4b4{
Te6edf3tlsf_walker Te6edf3pool_walker Tff7b72= Te6edf3walker Tff7b72? Te6edf3walker Tff7b72: Te6edf3default_walkerTb4b4b4;
Te6edf3block_header_tTff7b72* Te6edf3block Tff7b72=
Te6edf3offset_to_blockTb4b4b4(Te6edf3poolTb4b4b4, Tff7b72-Tb4b4b4(Tffa657intTb4b4b4)Te6edf3block_header_overheadTb4b4b4)Tb4b4b4;

Tff7b72while Tb4b4b4(Te6edf3block Tff7b72&Tff7b72& Tff7b72!Te6edf3block_is_lastTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4)
Tb4b4b4{
Te6edf3pool_walkerTb4b4b4(
Te6edf3block_to_ptrTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4,
Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4,
Tff7b72!Te6edf3block_is_freeTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4,
Te6edf3userTb4b4b4)Tb4b4b4;
Te6edf3block Tff7b72= Te6edf3block_nextTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657size_t Td2a8fftlsf_block_sizeTb4b4b4(Tffa657voidTff7b72* Te6edf3ptrTb4b4b4)
Tb4b4b4{
Tffa657size_t Te6edf3size Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3ptrTb4b4b4)
Tb4b4b4{
Tff7b72const Te6edf3block_header_tTff7b72* Te6edf3block Tff7b72= Te6edf3block_from_ptrTb4b4b4(Te6edf3ptrTb4b4b4)Tb4b4b4;
Te6edf3size Tff7b72= Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3sizeTb4b4b4;
Tb4b4b4}

Tffa657int Td2a8fftlsf_check_poolTb4b4b4(Te6edf3pool_t Te6edf3poolTb4b4b4)
Tb4b4b4{
T8b949e/* Check that the blocks are physically correct. */
Te6edf3integrity_t Te6edf3integ Tff7b72= Tb4b4b4{ T79c0ff0Tb4b4b4, T79c0ff0 Tb4b4b4}Tb4b4b4;
Te6edf3tlsf_walk_poolTb4b4b4(Te6edf3poolTb4b4b4, Te6edf3integrity_walkerTb4b4b4, Tff7b72&Te6edf3integTb4b4b4)Tb4b4b4;

Tff7b72return Te6edf3integTb4b4b4.Te6edf3statusTb4b4b4;
Tb4b4b4}

T8b949e/*
** Size of the TLSF structures in a given memory block passed to
** tlsf_create, equal to the size of a control_t
*/
Tffa657size_t Td2a8fftlsf_sizeTb4b4b4(Tffa657voidTb4b4b4)
Tb4b4b4{
Tff7b72return Tff7b72sizeofTb4b4b4(Te6edf3control_tTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657size_t Td2a8fftlsf_align_sizeTb4b4b4(Tffa657voidTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3ALIGN_SIZETb4b4b4;
Tb4b4b4}

Tffa657size_t Td2a8fftlsf_block_size_minTb4b4b4(Tffa657voidTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3block_size_minTb4b4b4;
Tb4b4b4}

Tffa657size_t Td2a8fftlsf_block_size_maxTb4b4b4(Tffa657voidTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3block_size_maxTb4b4b4;
Tb4b4b4}

T8b949e/*
** Overhead of the TLSF structures in a given memory block passed to
** tlsf_add_pool, equal to the overhead of a free block and the
** sentinel block.
*/
Tffa657size_t Td2a8fftlsf_pool_overheadTb4b4b4(Tffa657voidTb4b4b4)
Tb4b4b4{
Tff7b72return T79c0ff2 Tff7b72* Te6edf3block_header_overheadTb4b4b4;
Tb4b4b4}

Tffa657size_t Td2a8fftlsf_alloc_overheadTb4b4b4(Tffa657voidTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3block_header_overheadTb4b4b4;
Tb4b4b4}

Te6edf3pool_t Td2a8fftlsf_add_poolTb4b4b4(Te6edf3tlsf_t Te6edf3tlsfTb4b4b4, Tffa657voidTff7b72* Te6edf3memTb4b4b4, Tffa657size_t Te6edf3bytesTb4b4b4)
Tb4b4b4{
Te6edf3block_header_tTff7b72* Te6edf3blockTb4b4b4;
Te6edf3block_header_tTff7b72* Te6edf3nextTb4b4b4;

Tff7b72const Tffa657size_t Te6edf3pool_overhead Tff7b72= Te6edf3tlsf_pool_overheadTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Tffa657size_t Te6edf3pool_bytes Tff7b72= Te6edf3align_downTb4b4b4(Te6edf3bytes Tff7b72- Te6edf3pool_overheadTb4b4b4, Te6edf3ALIGN_SIZETb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Tb4b4b4(Tb4b4b4(Tffa657ptrdiff_tTb4b4b4)Te6edf3mem Tff7b72% Te6edf3ALIGN_SIZETb4b4b4) Tff7b72!Tff7b72= T79c0ff0Tb4b4b4)
Tb4b4b4{
Te6edf3printfTb4b4b4(Ta5d6ff"Ta5d6fftlsf_add_pool: Memory must be aligned by %u bytes.Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4(Tffa657unsigned Tffa657intTb4b4b4)Te6edf3ALIGN_SIZETb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3pool_bytes Tff7b72< Te6edf3block_size_min Tff7b72|Tff7b72| Te6edf3pool_bytes Tff7b72> Te6edf3block_size_maxTb4b4b4)
Tb4b4b4{
Tff7b72#Tff7b72if defined (TLSF_64BIT)
Te6edf3printfTb4b4b4(Ta5d6ff"Ta5d6fftlsf_add_pool: Memory size must be between 0x%x and 0x%x00 bytes.Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4(Tffa657unsigned Tffa657intTb4b4b4)Tb4b4b4(Te6edf3pool_overhead Tff7b72+ Te6edf3block_size_minTb4b4b4)Tb4b4b4,
Tb4b4b4(Tffa657unsigned Tffa657intTb4b4b4)Tb4b4b4(Tb4b4b4(Te6edf3pool_overhead Tff7b72+ Te6edf3block_size_maxTb4b4b4) Tff7b72/ T79c0ff256Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3printfTb4b4b4(Ta5d6ff"Ta5d6fftlsf_add_pool: Memory size must be between %u and %u bytes.Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4(Tffa657unsigned Tffa657intTb4b4b4)Tb4b4b4(Te6edf3pool_overhead Tff7b72+ Te6edf3block_size_minTb4b4b4)Tb4b4b4,
Tb4b4b4(Tffa657unsigned Tffa657intTb4b4b4)Tb4b4b4(Te6edf3pool_overhead Tff7b72+ Te6edf3block_size_maxTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

T8b949e/*
** Create the main free block. Offset the start of the block slightly
** so that the prev_phys_block field falls outside of the pool -
** it will never be used.
*/
Te6edf3block Tff7b72= Te6edf3offset_to_blockTb4b4b4(Te6edf3memTb4b4b4, Tff7b72-Tb4b4b4(Te6edf3tlsfptr_tTb4b4b4)Te6edf3block_header_overheadTb4b4b4)Tb4b4b4;
Te6edf3block_set_sizeTb4b4b4(Te6edf3blockTb4b4b4, Te6edf3pool_bytesTb4b4b4)Tb4b4b4;
Te6edf3block_set_freeTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3block_set_prev_usedTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3block_insertTb4b4b4(Te6edf3tlsf_castTb4b4b4(Te6edf3control_tTff7b72*Tb4b4b4, Te6edf3tlsfTb4b4b4)Tb4b4b4, Te6edf3blockTb4b4b4)Tb4b4b4;

T8b949e/* Split the block to create a zero-size sentinel block. */
Te6edf3next Tff7b72= Te6edf3block_link_nextTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3block_set_sizeTb4b4b4(Te6edf3nextTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3block_set_usedTb4b4b4(Te6edf3nextTb4b4b4)Tb4b4b4;
Te6edf3block_set_prev_freeTb4b4b4(Te6edf3nextTb4b4b4)Tb4b4b4;

Tff7b72return Te6edf3memTb4b4b4;
Tb4b4b4}

Tffa657void Td2a8fftlsf_remove_poolTb4b4b4(Te6edf3tlsf_t Te6edf3tlsfTb4b4b4, Te6edf3pool_t Te6edf3poolTb4b4b4)
Tb4b4b4{
Te6edf3control_tTff7b72* Te6edf3control Tff7b72= Te6edf3tlsf_castTb4b4b4(Te6edf3control_tTff7b72*Tb4b4b4, Te6edf3tlsfTb4b4b4)Tb4b4b4;
Te6edf3block_header_tTff7b72* Te6edf3block Tff7b72= Te6edf3offset_to_blockTb4b4b4(Te6edf3poolTb4b4b4, Tff7b72-Tb4b4b4(Tffa657intTb4b4b4)Te6edf3block_header_overheadTb4b4b4)Tb4b4b4;

Tffa657int Te6edf3fl Tff7b72= T79c0ff0Tb4b4b4, Te6edf3sl Tff7b72= T79c0ff0Tb4b4b4;

Te6edf3tlsf_assertTb4b4b4(Te6edf3block_is_freeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock should be freeTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_assertTb4b4b4(Tff7b72!Te6edf3block_is_freeTb4b4b4(Te6edf3block_nextTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffnext block should not be freeTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3tlsf_assertTb4b4b4(Te6edf3block_sizeTb4b4b4(Te6edf3block_nextTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0 Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffnext block size should be zeroTa5d6ff"Tb4b4b4)Tb4b4b4;

Te6edf3mapping_insertTb4b4b4(Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4, Tff7b72&Te6edf3flTb4b4b4, Tff7b72&Te6edf3slTb4b4b4)Tb4b4b4;
Te6edf3remove_free_blockTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4, Te6edf3flTb4b4b4, Te6edf3slTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/*
** TLSF main interface.
*/

Tff7b72#Tff7b72if _DEBUG
Tffa657int Td2a8fftest_ffs_flsTb4b4b4(Tb4b4b4)
Tb4b4b4{
T8b949e/* Verify ffs/fls work properly. */
Tffa657int Te6edf3rv Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3rv Tff7b72+Tff7b72= Tb4b4b4(Te6edf3tlsf_ffsTb4b4b4(T79c0ff0Tb4b4b4) Tff7b72=Tff7b72= T79c0ff-1Tb4b4b4) Tff7b72? T79c0ff0 Tff7b72: T79c0ff0x1Tb4b4b4;
Te6edf3rv Tff7b72+Tff7b72= Tb4b4b4(Te6edf3tlsf_flsTb4b4b4(T79c0ff0Tb4b4b4) Tff7b72=Tff7b72= T79c0ff-1Tb4b4b4) Tff7b72? T79c0ff0 Tff7b72: T79c0ff0x2Tb4b4b4;
Te6edf3rv Tff7b72+Tff7b72= Tb4b4b4(Te6edf3tlsf_ffsTb4b4b4(T79c0ff1Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tff7b72? T79c0ff0 Tff7b72: T79c0ff0x4Tb4b4b4;
Te6edf3rv Tff7b72+Tff7b72= Tb4b4b4(Te6edf3tlsf_flsTb4b4b4(T79c0ff1Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tff7b72? T79c0ff0 Tff7b72: T79c0ff0x8Tb4b4b4;
Te6edf3rv Tff7b72+Tff7b72= Tb4b4b4(Te6edf3tlsf_ffsTb4b4b4(T79c0ff0x80000000Tb4b4b4) Tff7b72=Tff7b72= T79c0ff31Tb4b4b4) Tff7b72? T79c0ff0 Tff7b72: T79c0ff0x10Tb4b4b4;
Te6edf3rv Tff7b72+Tff7b72= Tb4b4b4(Te6edf3tlsf_ffsTb4b4b4(T79c0ff0x80008000Tb4b4b4) Tff7b72=Tff7b72= T79c0ff15Tb4b4b4) Tff7b72? T79c0ff0 Tff7b72: T79c0ff0x20Tb4b4b4;
Te6edf3rv Tff7b72+Tff7b72= Tb4b4b4(Te6edf3tlsf_flsTb4b4b4(T79c0ff0x80000008Tb4b4b4) Tff7b72=Tff7b72= T79c0ff31Tb4b4b4) Tff7b72? T79c0ff0 Tff7b72: T79c0ff0x40Tb4b4b4;
Te6edf3rv Tff7b72+Tff7b72= Tb4b4b4(Te6edf3tlsf_flsTb4b4b4(T79c0ff0x7FFFFFFFTb4b4b4) Tff7b72=Tff7b72= T79c0ff30Tb4b4b4) Tff7b72? T79c0ff0 Tff7b72: T79c0ff0x80Tb4b4b4;

Tff7b72#Tff7b72if defined (TLSF_64BIT)
Te6edf3rv Tff7b72+Tff7b72= Tb4b4b4(Te6edf3tlsf_fls_sizetTb4b4b4(T79c0ff0x80000000Tb4b4b4) Tff7b72=Tff7b72= T79c0ff31Tb4b4b4) Tff7b72? T79c0ff0 Tff7b72: T79c0ff0x100Tb4b4b4;
Te6edf3rv Tff7b72+Tff7b72= Tb4b4b4(Te6edf3tlsf_fls_sizetTb4b4b4(T79c0ff0x100000000Tb4b4b4) Tff7b72=Tff7b72= T79c0ff32Tb4b4b4) Tff7b72? T79c0ff0 Tff7b72: T79c0ff0x200Tb4b4b4;
Te6edf3rv Tff7b72+Tff7b72= Tb4b4b4(Te6edf3tlsf_fls_sizetTb4b4b4(T79c0ff0xffffffffffffffffTb4b4b4) Tff7b72=Tff7b72= T79c0ff63Tb4b4b4) Tff7b72? T79c0ff0 Tff7b72: T79c0ff0x400Tb4b4b4;
Tff7b72#Tff7b72endif

Tff7b72if Tb4b4b4(Te6edf3rvTb4b4b4)
Tb4b4b4{
Te6edf3printfTb4b4b4(Ta5d6ff"Ta5d6fftest_ffs_fls: %x ffs/fls tests failed.Tffea00\nTa5d6ff"Tb4b4b4, Te6edf3rvTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3rvTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif

Te6edf3tlsf_t Td2a8fftlsf_createTb4b4b4(Tffa657voidTff7b72* Te6edf3memTb4b4b4)
Tb4b4b4{
Tff7b72#Tff7b72if _DEBUG
Tff7b72if Tb4b4b4(Te6edf3test_ffs_flsTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif

Tff7b72if Tb4b4b4(Tb4b4b4(Tb4b4b4(Te6edf3tlsfptr_tTb4b4b4)Te6edf3mem Tff7b72% Te6edf3ALIGN_SIZETb4b4b4) Tff7b72!Tff7b72= T79c0ff0Tb4b4b4)
Tb4b4b4{
Te6edf3printfTb4b4b4(Ta5d6ff"Ta5d6fftlsf_create: Memory must be aligned to %u bytes.Tffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4(Tffa657unsigned Tffa657intTb4b4b4)Te6edf3ALIGN_SIZETb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

Te6edf3control_constructTb4b4b4(Te6edf3tlsf_castTb4b4b4(Te6edf3control_tTff7b72*Tb4b4b4, Te6edf3memTb4b4b4)Tb4b4b4)Tb4b4b4;

Tff7b72return Te6edf3tlsf_castTb4b4b4(Te6edf3tlsf_tTb4b4b4, Te6edf3memTb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3tlsf_t Td2a8fftlsf_create_with_poolTb4b4b4(Tffa657voidTff7b72* Te6edf3memTb4b4b4, Tffa657size_t Te6edf3bytesTb4b4b4)
Tb4b4b4{
Te6edf3tlsf_t Te6edf3tlsf Tff7b72= Te6edf3tlsf_createTb4b4b4(Te6edf3memTb4b4b4)Tb4b4b4;
Te6edf3tlsf_add_poolTb4b4b4(Te6edf3tlsfTb4b4b4, Tb4b4b4(Tffa657charTff7b72*Tb4b4b4)Te6edf3mem Tff7b72+ Te6edf3tlsf_sizeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3bytes Tff7b72- Te6edf3tlsf_sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3tlsfTb4b4b4;
Tb4b4b4}

Tffa657void Td2a8fftlsf_destroyTb4b4b4(Te6edf3tlsf_t Te6edf3tlsfTb4b4b4)
Tb4b4b4{
T8b949e/* Nothing to do. */
Tb4b4b4(Tffa657voidTb4b4b4)Te6edf3tlsfTb4b4b4;
Tb4b4b4}

Te6edf3pool_t Td2a8fftlsf_get_poolTb4b4b4(Te6edf3tlsf_t Te6edf3tlsfTb4b4b4)
Tb4b4b4{
Tff7b72return Te6edf3tlsf_castTb4b4b4(Te6edf3pool_tTb4b4b4, Tb4b4b4(Tffa657charTff7b72*Tb4b4b4)Te6edf3tlsf Tff7b72+ Te6edf3tlsf_sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657voidTff7b72* Td2a8fftlsf_mallocTb4b4b4(Te6edf3tlsf_t Te6edf3tlsfTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Te6edf3control_tTff7b72* Te6edf3control Tff7b72= Te6edf3tlsf_castTb4b4b4(Te6edf3control_tTff7b72*Tb4b4b4, Te6edf3tlsfTb4b4b4)Tb4b4b4;
Tff7b72const Tffa657size_t Te6edf3adjust Tff7b72= Te6edf3adjust_request_sizeTb4b4b4(Te6edf3sizeTb4b4b4, Te6edf3ALIGN_SIZETb4b4b4)Tb4b4b4;
Te6edf3block_header_tTff7b72* Te6edf3block Tff7b72= Te6edf3block_locate_freeTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3adjustTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3block_prepare_usedTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4, Te6edf3adjustTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657voidTff7b72* Td2a8fftlsf_memalignTb4b4b4(Te6edf3tlsf_t Te6edf3tlsfTb4b4b4, Tffa657size_t Te6edf3alignTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Te6edf3control_tTff7b72* Te6edf3control Tff7b72= Te6edf3tlsf_castTb4b4b4(Te6edf3control_tTff7b72*Tb4b4b4, Te6edf3tlsfTb4b4b4)Tb4b4b4;
Tff7b72const Tffa657size_t Te6edf3adjust Tff7b72= Te6edf3adjust_request_sizeTb4b4b4(Te6edf3sizeTb4b4b4, Te6edf3ALIGN_SIZETb4b4b4)Tb4b4b4;

T8b949e/*
** We must allocate an additional minimum block size bytes so that if
** our free block will leave an alignment gap which is smaller, we can
** trim a leading free block and release it back to the pool. We must
** do this because the previous physical block is in use, therefore
** the prev_phys_block field is not valid, and we can't simply adjust
** the size of that block.
*/
Tff7b72const Tffa657size_t Te6edf3gap_minimum Tff7b72= Tff7b72sizeofTb4b4b4(Te6edf3block_header_tTb4b4b4)Tb4b4b4;
Tff7b72const Tffa657size_t Te6edf3size_with_gap Tff7b72= Te6edf3adjust_request_sizeTb4b4b4(Te6edf3adjust Tff7b72+ Te6edf3align Tff7b72+ Te6edf3gap_minimumTb4b4b4, Te6edf3alignTb4b4b4)Tb4b4b4;

T8b949e/*
** If alignment is less than or equals base alignment, we're done.
** If we requested 0 bytes, return null, as tlsf_malloc(0) does.
*/
Tff7b72const Tffa657size_t Te6edf3aligned_size Tff7b72= Tb4b4b4(Te6edf3adjust Tff7b72&Tff7b72& Te6edf3align Tff7b72> Te6edf3ALIGN_SIZETb4b4b4) Tff7b72? Te6edf3size_with_gap Tff7b72: Te6edf3adjustTb4b4b4;

Te6edf3block_header_tTff7b72* Te6edf3block Tff7b72= Te6edf3block_locate_freeTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3aligned_sizeTb4b4b4)Tb4b4b4;

T8b949e/* This can't be a static assert. */
Te6edf3tlsf_assertTb4b4b4(Tff7b72sizeofTb4b4b4(Te6edf3block_header_tTb4b4b4) Tff7b72=Tff7b72= Te6edf3block_size_min Tff7b72+ Te6edf3block_header_overheadTb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3blockTb4b4b4)
Tb4b4b4{
Tffa657voidTff7b72* Te6edf3ptr Tff7b72= Te6edf3block_to_ptrTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Tffa657voidTff7b72* Te6edf3aligned Tff7b72= Te6edf3align_ptrTb4b4b4(Te6edf3ptrTb4b4b4, Te6edf3alignTb4b4b4)Tb4b4b4;
Tffa657size_t Te6edf3gap Tff7b72= Te6edf3tlsf_castTb4b4b4(Tffa657size_tTb4b4b4,
Te6edf3tlsf_castTb4b4b4(Te6edf3tlsfptr_tTb4b4b4, Te6edf3alignedTb4b4b4) Tff7b72- Te6edf3tlsf_castTb4b4b4(Te6edf3tlsfptr_tTb4b4b4, Te6edf3ptrTb4b4b4)Tb4b4b4)Tb4b4b4;

T8b949e/* If gap size is too small, offset to next aligned boundary. */
Tff7b72if Tb4b4b4(Te6edf3gap Tff7b72&Tff7b72& Te6edf3gap Tff7b72< Te6edf3gap_minimumTb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657size_t Te6edf3gap_remain Tff7b72= Te6edf3gap_minimum Tff7b72- Te6edf3gapTb4b4b4;
Tff7b72const Tffa657size_t Te6edf3offset Tff7b72= Te6edf3tlsf_maxTb4b4b4(Te6edf3gap_remainTb4b4b4, Te6edf3alignTb4b4b4)Tb4b4b4;
Tff7b72const Tffa657voidTff7b72* Te6edf3next_aligned Tff7b72= Te6edf3tlsf_castTb4b4b4(Tffa657voidTff7b72*Tb4b4b4,
Te6edf3tlsf_castTb4b4b4(Te6edf3tlsfptr_tTb4b4b4, Te6edf3alignedTb4b4b4) Tff7b72+ Te6edf3offsetTb4b4b4)Tb4b4b4;

Te6edf3aligned Tff7b72= Te6edf3align_ptrTb4b4b4(Te6edf3next_alignedTb4b4b4, Te6edf3alignTb4b4b4)Tb4b4b4;
Te6edf3gap Tff7b72= Te6edf3tlsf_castTb4b4b4(Tffa657size_tTb4b4b4,
Te6edf3tlsf_castTb4b4b4(Te6edf3tlsfptr_tTb4b4b4, Te6edf3alignedTb4b4b4) Tff7b72- Te6edf3tlsf_castTb4b4b4(Te6edf3tlsfptr_tTb4b4b4, Te6edf3ptrTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3gapTb4b4b4)
Tb4b4b4{
Te6edf3tlsf_assertTb4b4b4(Te6edf3gap Tff7b72>Tff7b72= Te6edf3gap_minimum Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffgap size too smallTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3block Tff7b72= Te6edf3block_trim_free_leadingTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4, Te6edf3gapTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72return Te6edf3block_prepare_usedTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4, Te6edf3adjustTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Td2a8fftlsf_freeTb4b4b4(Te6edf3tlsf_t Te6edf3tlsfTb4b4b4, Tffa657voidTff7b72* Te6edf3ptrTb4b4b4)
Tb4b4b4{
T8b949e/* Don't attempt to free a NULL pointer. */
Tff7b72if Tb4b4b4(Te6edf3ptrTb4b4b4)
Tb4b4b4{
Te6edf3control_tTff7b72* Te6edf3control Tff7b72= Te6edf3tlsf_castTb4b4b4(Te6edf3control_tTff7b72*Tb4b4b4, Te6edf3tlsfTb4b4b4)Tb4b4b4;
Te6edf3block_header_tTff7b72* Te6edf3block Tff7b72= Te6edf3block_from_ptrTb4b4b4(Te6edf3ptrTb4b4b4)Tb4b4b4;
Te6edf3tlsf_assertTb4b4b4(Tff7b72!Te6edf3block_is_freeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock already marked as freeTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3block_mark_as_freeTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3block Tff7b72= Te6edf3block_merge_prevTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3block Tff7b72= Te6edf3block_merge_nextTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3block_insertTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/*
** The TLSF block information provides us with enough information to
** provide a reasonably intelligent implementation of realloc, growing or
** shrinking the currently allocated block as required.
**
** This routine handles the somewhat esoteric edge cases of realloc:
** - a non-zero size with a null pointer will behave like malloc
** - a zero size with a non-null pointer will behave like free
** - a request that cannot be satisfied will leave the original buffer
** untouched
** - an extended buffer size will leave the newly-allocated area with
** contents undefined
*/
Tffa657voidTff7b72* Td2a8fftlsf_reallocTb4b4b4(Te6edf3tlsf_t Te6edf3tlsfTb4b4b4, Tffa657voidTff7b72* Te6edf3ptrTb4b4b4, Tffa657size_t Te6edf3sizeTb4b4b4)
Tb4b4b4{
Te6edf3control_tTff7b72* Te6edf3control Tff7b72= Te6edf3tlsf_castTb4b4b4(Te6edf3control_tTff7b72*Tb4b4b4, Te6edf3tlsfTb4b4b4)Tb4b4b4;
Tffa657voidTff7b72* Te6edf3p Tff7b72= T79c0ff0Tb4b4b4;

T8b949e/* Zero-size requests are treated as free. */
Tff7b72if Tb4b4b4(Te6edf3ptr Tff7b72&Tff7b72& Te6edf3size Tff7b72=Tff7b72= T79c0ff0Tb4b4b4)
Tb4b4b4{
Te6edf3tlsf_freeTb4b4b4(Te6edf3tlsfTb4b4b4, Te6edf3ptrTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/* Requests with NULL pointers are treated as malloc. */
Tff7b72else Tff7b72if Tb4b4b4(Tff7b72!Te6edf3ptrTb4b4b4)
Tb4b4b4{
Te6edf3p Tff7b72= Te6edf3tlsf_mallocTb4b4b4(Te6edf3tlsfTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else
Tb4b4b4{
Te6edf3block_header_tTff7b72* Te6edf3block Tff7b72= Te6edf3block_from_ptrTb4b4b4(Te6edf3ptrTb4b4b4)Tb4b4b4;
Te6edf3block_header_tTff7b72* Te6edf3next Tff7b72= Te6edf3block_nextTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;

Tff7b72const Tffa657size_t Te6edf3cursize Tff7b72= Te6edf3block_sizeTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Tff7b72const Tffa657size_t Te6edf3combined Tff7b72= Te6edf3cursize Tff7b72+ Te6edf3block_sizeTb4b4b4(Te6edf3nextTb4b4b4) Tff7b72+ Te6edf3block_header_overheadTb4b4b4;
Tff7b72const Tffa657size_t Te6edf3adjust Tff7b72= Te6edf3adjust_request_sizeTb4b4b4(Te6edf3sizeTb4b4b4, Te6edf3ALIGN_SIZETb4b4b4)Tb4b4b4;

Te6edf3tlsf_assertTb4b4b4(Tff7b72!Te6edf3block_is_freeTb4b4b4(Te6edf3blockTb4b4b4) Tff7b72&Tff7b72& Ta5d6ff"Ta5d6ffblock already marked as freeTa5d6ff"Tb4b4b4)Tb4b4b4;

T8b949e/*
** If the next block is used, or when combined with the current
** block, does not offer enough space, we must reallocate and copy.
*/
Tff7b72if Tb4b4b4(Te6edf3adjust Tff7b72> Te6edf3cursize Tff7b72&Tff7b72& Tb4b4b4(Tff7b72!Te6edf3block_is_freeTb4b4b4(Te6edf3nextTb4b4b4) Tff7b72|Tff7b72| Te6edf3adjust Tff7b72> Te6edf3combinedTb4b4b4)Tb4b4b4)
Tb4b4b4{
Te6edf3p Tff7b72= Te6edf3tlsf_mallocTb4b4b4(Te6edf3tlsfTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3pTb4b4b4)
Tb4b4b4{
Tff7b72const Tffa657size_t Te6edf3minsize Tff7b72= Te6edf3tlsf_minTb4b4b4(Te6edf3cursizeTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3pTb4b4b4, Te6edf3ptrTb4b4b4, Te6edf3minsizeTb4b4b4)Tb4b4b4;
Te6edf3tlsf_freeTb4b4b4(Te6edf3tlsfTb4b4b4, Te6edf3ptrTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72else
Tb4b4b4{
T8b949e/* Do we need to expand to the next block? */
Tff7b72if Tb4b4b4(Te6edf3adjust Tff7b72> Te6edf3cursizeTb4b4b4)
Tb4b4b4{
Te6edf3block_merge_nextTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4)Tb4b4b4;
Te6edf3block_mark_as_usedTb4b4b4(Te6edf3blockTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/* Trim the resulting block and return the original pointer. */
Te6edf3block_trim_usedTb4b4b4(Te6edf3controlTb4b4b4, Te6edf3blockTb4b4b4, Te6edf3adjustTb4b4b4)Tb4b4b4;
Te6edf3p Tff7b72= Te6edf3ptrTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72return Te6edf3pTb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72endif

Served by rngit 1.4.2 - Generated in 0.09s